#include "button.h"

// 使用中断方案检测按键是否按下
void BUTTON_init(void)
{
    // GPIO时钟使能
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

    // 端口初始化
    GPIO_InitTypeDef gpio_initStruct = {0};
    // 输入下拉（Input Pull-Down）
    // 默认状态为低电平（0），外部需要拉高才能改变状态
    // 适用场景：按键检测（常见的高电平触发按键）
    gpio_initStruct.GPIO_Mode = GPIO_Mode_IPD;
    gpio_initStruct.GPIO_Pin = K1_Pin;
    GPIO_Init(K1_Port, &gpio_initStruct);

    gpio_initStruct.GPIO_Pin = K2_Pin;
    GPIO_Init(K2_Port, &gpio_initStruct);

    // 中断配置: K1 PA0,按下为高电平
    // 1. 先开启本身的中断
    EXTI_InitTypeDef EXTI_initStruct = {0};
    // 需要配置的通道
    EXTI_initStruct.EXTI_Line = EXTI_Line0;
    // 只开启中断，不使用事件
    EXTI_initStruct.EXTI_Mode = EXTI_Mode_Interrupt;
    // 只开启上升沿
    EXTI_initStruct.EXTI_Trigger = EXTI_Trigger_Rising;
    // 使能中断
    EXTI_initStruct.EXTI_LineCmd = ENABLE;
    // 中断初始化
    EXTI_Init(&EXTI_initStruct);

    // 2. 开启NVIC对应的通道
    NVIC_InitTypeDef NVIC_initStruct = {0};
    NVIC_initStruct.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_initStruct.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_initStruct.NVIC_IRQChannelSubPriority = 2;
    NVIC_initStruct.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_initStruct);
}

// FlagStatus BUTTON_isClicked(GPIO_TypeDef *keyPort, uint16_t keyPin)
// {
//     uint8_t ret;

//     // 按键按下的判断流程：
//     // 先判断按键是否被按下，如果不是，直接返回
//     ret = GPIO_ReadInputDataBit(keyPort, keyPin);
//     if(ret != Bit_SET)
//     {
//         return RESET;
//     }

//     // 等待一段时间（10ms）
//     mySYSTICK_delayMs(5);

//     // 再次判断按键是否被按下，如果不是，直接返回
//     ret = GPIO_ReadInputDataBit(keyPort, keyPin);
//     if(ret != Bit_SET)
//     {
//         return RESET;
//     }

//     // 等待按键弹起（值变为0）
//     do
//     {
//         ret = GPIO_ReadInputDataBit(keyPort, keyPin);
//     } while (ret != RESET);
    
//     return SET;
// }
